package br.com.gbvbahia.mybooks.service;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import android.util.Log;
import br.com.gbvbahia.commons.modelos.EntityInterface;
import br.com.gbvbahia.commons.utils.NumberUtils;
import br.com.gbvbahia.mybooks.ActivityMae;
import br.com.gbvbahia.mybooks.dao.EditoraDAO;
import br.com.gbvbahia.mybooks.dao.LivroDAO;
import br.com.gbvbahia.mybooks.dao.LivroPrateleiraDAO;
import br.com.gbvbahia.mybooks.dao.PrateleiraDAO;
import br.com.gbvbahia.mybooks.dao.contract.DB;
import br.com.gbvbahia.mybooks.modelos.EditoraVO;
import br.com.gbvbahia.mybooks.modelos.LivroPrateleiraVO;
import br.com.gbvbahia.mybooks.modelos.LivroVO;
import br.com.gbvbahia.mybooks.modelos.PerfilVO;
import br.com.gbvbahia.mybooks.modelos.PrateleiraVO;
import br.com.gbvbahia.mybooks.service.model.LivroModel;
import br.com.gbvbahia.mybooks.service.model.RemovidoModel;
import br.com.gbvbahia.mybooks.service.ws.WebService;

/**
 * Realiza tarefas referente a sincronizacao de informacao. Logicas que devem
 * ser separadas devido complexidade.
 * 
 * @author Guilherme
 * 
 */
public class SyncService {

	public static int gravarLivrosNotSync(PerfilVO perfil,
			List<LivroModel> livros, LivroDAO livroDao, EditoraDAO editoraDao,
			PrateleiraDAO pratDao) {
		try {
			for (LivroModel model : livros) {
				montarEditora(model, editoraDao);
				PrateleiraVO pratLivro = montarPrateleira(model, pratDao);
				LivroVO toSync = model.mountarLivroVO(editoraDao, pratDao);
				toSync.setSincronizado(DB.SINCRONIZADO);
				if (StringUtils.isBlank(toSync.getId())
						|| livroDao.getByID(toSync.getId()) == null) {
					livroDao.insert(toSync);
				} else {
					LivroVO toComprare = livroDao.getByID(toSync.getId());
					if (toComprare.getDataAlteracao() < toSync
							.getDataAlteracao()) {
						livroDao.update(toSync);
					}
				}
				if (pratLivro != null) {
					LivroPrateleiraDAO lpDao = new LivroPrateleiraDAO();
					LivroPrateleiraVO lpvo = new LivroPrateleiraVO();
					lpvo.setCdLivro(toSync.getId());
					lpvo.setCdPrateleira(pratLivro.getId());
					lpDao.insert(lpvo, livroDao.getDataBase());
				}
			}
			return WebService.SINC_EFETUADA_OK;
		} catch (Exception e) {
			Log.e(ActivityMae.LOG_TAG, "SyncService gravarLivrosNotSync", e);
			return WebService.SINC_EFETUADA_ERRO;
		}
	}

	private static PrateleiraVO montarPrateleira(LivroModel model,
			PrateleiraDAO pratDao) {
		if (!StringUtils.isBlank(model.getPrateleiras())) {
			PrateleiraVO vo = pratDao.getPrateleiraByName(model
					.getPrateleiras());
			if (vo == null) {
				vo = new PrateleiraVO();
			}
			if (StringUtils.isBlank(vo.getId())
					|| vo.getDataAlteracao() < Long.parseLong(model
							.getDataAlteracaoPrateleira())) {
				vo.setNome(model.getPrateleiras());
				vo.setSincronizado(DB.SINCRONIZADO);
				vo.setDataAlteracao(Long.parseLong(model
						.getDataAlteracaoPrateleira()));
				vo.setDescricao(model.getPratDescricao());
				vo.setPublica(Boolean.getBoolean(model.getPratPublica()) ? EntityInterface.TRUE
						: EntityInterface.FALSE);
				if (StringUtils.isBlank(vo.getId())) {
					vo.setId(model.getIdPrateleiraMobile());
					pratDao.insert(vo);
				} else {
					pratDao.update(vo);
				}
				return vo;
			}
		}
		return null;
	}

	private static void montarEditora(LivroModel model, EditoraDAO editoraDao) {
		if (!StringUtils.isBlank(model.getEditoraNome())) {
			EditoraVO vo = editoraDao.getEditoraByName(model.getEditoraNome());
			if (vo == null) {
				vo = new EditoraVO();
			}
			if (StringUtils.isBlank(vo.getId())
					|| vo.getDataAlteracao() < Long.parseLong(model
							.getDataAlteracaoEditora())) {
				vo.setDataAlteracao(Long.parseLong(model
						.getDataAlteracaoEditora()));
				vo.setNome(model.getEditoraNome());
				vo.setSincronizado(DB.SINCRONIZADO);
				if (StringUtils.isBlank(vo.getId())) {
					vo.setId(model.getIdEditoraMobile());
					editoraDao.insert(vo);
				} else {
					editoraDao.update(vo);
				}
			}
		}
	}

	public static int removerLivros(List<RemovidoModel> removidos,
			LivroDAO livroDao, LivroPrateleiraDAO lpDao) {
		try {
			for (RemovidoModel rm : removidos) {
				LivroVO toRemove = livroDao.getByID(rm.getIdLivroRemovido());
				Long data = NumberUtils.getLongString(rm.getDataRemocao());
				if (toRemove != null && data != null
						&& data > toRemove.getDataAlteracao()) {
					lpDao.deleteLivro(toRemove.getId(), livroDao.getDataBase());
					livroDao.delete(toRemove);
				}
			}
			return WebService.SINC_EFETUADA_OK;
		} catch (Exception e) {
			Log.e(ActivityMae.LOG_TAG, "SyncService removerLivros", e);
			return WebService.SINC_EFETUADA_ERRO;
		}
	}
}
